HTMLify

script.js
Views: 48 | Author: cody
$(document).ready(function () {
    let $canvas = $("#loader canvas"),
        canvas = $canvas[0],
        renderer = new THREE.WebGLRenderer({
            canvas: canvas,
            context: canvas.getContext("webgl2"),
            antialias: true,
            alpha: true
        });

    renderer.setSize($canvas.width(), $canvas.height());
    renderer.setPixelRatio(window.devicePixelRatio || 1);

    let scene = new THREE.Scene();
    let camera = new THREE.PerspectiveCamera(
        45,
        $canvas.width() / $canvas.height(),
        0.1,
        1000
    );

    camera.position.z = 500;

    let shape = new THREE.TorusGeometry(70, 20, 60, 160);
    let material = new THREE.MeshPhongMaterial({
        color: 0xe4ecfa,
        shininess: 20,
        opacity: 0.96,
        transparent: true
    });
    let donut = new THREE.Mesh(shape, material);

    scene.add(donut);

    let lightTop = new THREE.DirectionalLight(0xffffff, 0.3);
    lightTop.position.set(0, 200, 0);
    lightTop.castShadow = true;
    scene.add(lightTop);

    let frontTop = new THREE.DirectionalLight(0xffffff, 0.4);
    frontTop.position.set(0, 0, 300);
    frontTop.castShadow = true;
    scene.add(frontTop);

    scene.add(new THREE.AmbientLight(0xcdd9ed));

    function twist(geometry, amount) {
        const quaternion = new THREE.Quaternion();
        for (let i = 0; i < geometry.vertices.length; i++) {
            quaternion.setFromAxisAngle(
                new THREE.Vector3(1, 0, 0),
                (Math.PI / 180) * (geometry.vertices[i].x / amount)
            );
            geometry.vertices[i].applyQuaternion(quaternion);
        }
        geometry.verticesNeedUpdate = true;
    }

    let mat = Math.PI,
        speed = Math.PI / 120,
        forwards = 1;

    var render = function () {
        requestAnimationFrame(render);

        donut.rotation.x -= speed * forwards;

        mat = mat - speed;

        if (mat <= 0) {
            mat = Math.PI;
            forwards = forwards * -1;
        }

        twist(shape, (mat >= Math.PI / 2 ? -120 : 120) * forwards);

        renderer.render(scene, camera);
    };

    render();
});

Comments